package timer

import (
	"sync"

	"gitee.com/doraemon1996/bunny/goroutine"
)

// 定时任务对象缓存池
var taskPool = &sync.Pool{
	New: func() any {
		return new(task)
	},
}

func newTask(taskID, interval uint64, callback func()) (obj *task) {
	obj = taskPool.Get().(*task)
	obj.taskID = taskID
	obj.interval = interval
	obj.callback = callback
	return
}

func releaseTask(obj *task) {
	obj.taskID = 0
	obj.interval = 0
	obj.callback = nil
	taskPool.Put(obj)
}

// 定时任务结构体
type task struct {
	mu sync.Mutex

	// 定时任务唯一ID
	taskID uint64

	// 循环执行间隔时间
	interval uint64

	// 回调函数
	callback func()
}

// 获取定时任务唯一ID
func (t *task) GetTaskID() uint64 {
	return t.taskID
}

// 获取定时任务间隔时间
func (t *task) GetInterval() uint64 {
	t.mu.Lock()
	defer t.mu.Unlock()

	return t.interval
}

// 取消执行定时任务
func (t *task) Cancel() {
	t.mu.Lock()
	defer t.mu.Unlock()

	if t.callback != nil {
		t.callback = nil
		t.interval = 0
	}
}

// 提交执行定时任务
func (t *task) Submit() {
	t.mu.Lock()
	defer t.mu.Unlock()

	if t.callback != nil {
		goroutine.Submit(t.callback)
	}
}
